function deepClone(obj, map = new Map()) {
  // 在这一步检查输入是否为引用类型
  if (obj instanceof Object === false) {
    return obj;
  }
  // 解决循环引用问题
  if (map.has(obj)) {
    return map.get(obj);
  } else {
    map.set(obj, target);
  }

  let target = Array.isArray(obj) ? [] : {};
  for (let key in obj) {
    if (Object.prototype.hasOwnProperty(key)) {
      // 检查自身上的可枚举属性
      if (obj[key] instanceof Object === false) {
        target[key] = obj[key];
      } else {
        target[key] = deepClone(obj[key]);
      }
    }
  }
  return target;
}
